#include <FastBot.h>
#include <microDS3231.h>
#include <FastLED.h>

#define LED_PIN D9
#define CHIPSET WS2811
#define COLOR_ORDER GRB
#define NUM_LEDS 16
#define BRIGHTNESS 255
#define WIFI_SSID "2065-IoT"
#define WIFI_PASS "123123123"
#define BOT_TOKEN "6966054524:AAFDVfFvJoGW0-SeeAUIbaOCER2ST56kBMo"
#define ButtPin D3
#define ZumPin D6

CRGB leds[NUM_LEDS];
FastBot bot(BOT_TOKEN);
MicroDS3231 rtc;

String Time_p1;
String time_;
String medicine_name;

uint32_t timer = 0;
int hours_;
int minutes_;

String priem1;
int time_priem1;
String priem2;
int time_priem2;
String priem3;
int time_priem3;
const long interval = 30000;
unsigned long previousMillis = 0;
unsigned long currentMillis;

bool flag_A = false;
bool flag1 = false;
bool flag_B = false;
int ccounter = 0;
void setup() {
  connectWiFi();
  FastLED.addLeds<CHIPSET, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip);
  FastLED.setBrightness(BRIGHTNESS);
  FastLED.clear(true);
  FastLED.show();

  bot.attach(newMsg);
  pinMode(ButtPin, INPUT_PULLUP);
  pinMode(ZumPin, OUTPUT);
  bot.setChatID("939019640");

  String welcom = "Здравствуйте! Я телеграмм бот от проекта 'Электронная медсестра'.\n";
  welcom += "Всегда подскажу принял ли ваш пациент прописанные лекарства.\n";
  welcom += "Устройство включено\n";

  rtc.setTime(COMPILE_TIME);

  bot.sendMessage(welcom);
  bot.sendMessage("Пожалуйста, введите название лекарства и время его приёма");

  Serial.begin(115200);
}

void newMsg(FB_msg& msg) {
  if (msg.text.startsWith("Прием1:")) {
    parseMedicineTime(msg, priem1, time_priem1);
  }

  if (msg.text.startsWith("Прием2:")) {
    parseMedicineTime(msg, priem2, time_priem2);
  }

  if (msg.text.startsWith("Прием3:")) {
    parseMedicineTime(msg, priem3, time_priem3);
  }
}

void parseMedicineTime(FB_msg& msg, String& medicine, int& time) {
  Time_p1 = msg.text.substring(12);
  int commaIndex = Time_p1.indexOf(',');
  time_ = Time_p1.substring(0, commaIndex);
  medicine = Time_p1.substring(commaIndex + 1);
  Serial.println(time_);
  Serial.println(medicine);
  int dotIndex = time_.indexOf(':');
  time = time_.substring(0, dotIndex).toInt();
}

void loop() {
  bot.tick();
  if (millis() - timer >= 1000) {
    timer = millis();
    int hours = rtc.getHours();  // Получаем текущие часы
    bool butt = !digitalRead(ButtPin);
    updateMedicineInfo(hours);  // Передаем текущее время в функцию обновления информации о лекарствах
    if (hours_ == hours && flag_A == false) {
      //flag_A = true;
      tone(ZumPin, 2000);
      ccounter++;
      //currentMillis = millis();
      //Serial.println(ccounter);
      if (ccounter >= 30 && flag_B == false) {
        flag_B = true;
        flag_A = true;
        ccounter = 0;
        bot.sendMessage("Внимание! Пациент не отвечает на сигналы! Срочно свяжитесь с ним!");
        noTone(ZumPin);
        previousMillis = currentMillis;
        for (int i = 0; i < NUM_LEDS; i++) {
          leds[i] = CRGB::Red;                // Устанавливаем цвет для текущего светодиода
          FastLED.setBrightness(BRIGHTNESS);  // Устанавливаем яркость
          FastLED.show();                     // Показываем изменения на светодиодной ленте
          delay(100);
        }
        delay(7000);
        FastLED.clear(true);
      }
    }
    //Serial.println(millis() - currentMillis);
    //Serial.println(ccounter);

    if (butt) {
      Serial.println("Button Pressed");
      Serial.print("Before button press - Current Time: ");
      Serial.println(rtc.getHours());
      Serial.print("After button press - Current Time: ");
      Serial.println(rtc.getHours());
      handleButtonPress(rtc.getHours());  // Передаем текущее время в функцию обработки нажатия кнопки
    }
  }
}


void updateMedicineInfo(int h) {
  if (h > 0 && h <= 9) {
    hours_ = time_priem1;
    medicine_name = priem1;
  } else if (h > 10 && h <= 16) {
    hours_ = time_priem2;
    medicine_name = priem2;
  } else if (h > 17 && h < 24) {
    hours_ = time_priem3;
    medicine_name = priem3;
  }
}

void handleButtonPress(int h) {
  if (flag_A == false && hours_ == h) {
    bot.sendMessage("Пациент с устройством под номером 001 принял лекарство: " + medicine_name);
    setColorForLeds(CRGB::LimeGreen);
    flag_A = true;
    noTone(ZumPin);

  } else {
    bot.sendMessage("Пациент с устройством под номером 001 принял лекарство: " + medicine_name + " в неназначенное время");
    setColorForLeds(CRGB::Red);
    flag_A = true;
    noTone(ZumPin);
  }
}

void setColorForLeds(CRGB color) {
  for (int i = 0; i < NUM_LEDS; i++) {
    leds[i] = color;                    // Устанавливаем цвет для текущего светодиода
    FastLED.setBrightness(BRIGHTNESS);  // Устанавливаем яркость
    FastLED.show();                     // Показываем изменения на светодиодной ленте
    delay(100);
  }
  delay(7000);
  FastLED.clear(true);
}

void connectWiFi() {
  delay(2000);
  WiFi.begin(WIFI_SSID, WIFI_PASS);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
    if (millis() > 15000) {
      ESP.restart();
    }
  }

  Serial.println("Connected");
}
